18. Qemu模式下的模糊测试

如果你没有源代码,那么你可以使用Qemu模式来对二进制文件进行模糊测试:

$ sudo ./build_qemu_support.sh

它将诉说缺少一些依赖性,所以我们需要安装以下软件包:

$ sudo apt install libtool-bin
$ sudo apt install bison
$ sudo apt install libglib2.0-dev

然后再次运行:

$ sudo ./build_qemu_support.sh

但最新版本的qemu有一些错误,所以构建脚本又会失败。打开./build_qemu_support.sh,寻找以下内容:

tar xf "$ARCHIVE" || exit 1

将其改为以下内容,以避免解包失败:

tar xf "$ARCHIVE" --exclude qemu-2.10.0/roms/u-boot/scripts/Kconfig || exit 1

之后再次运行:

$ sudo ./build_qemu_support.sh

再次构建将失败,出现以下错误:

254 | _syscall0(int, gettid)
 |                ^~~~~~
 TOPDIR/tmp/work/x86_64-linux/qemu-native/3.1.0-r0/qemu-3.1.0/linux-user/syscall.c:185:13: note: in definition of macro _syscall0'
 185 | static type name (void)   \
 |             ^~~~

为此,我们需要使用一个hack,打开qemu/linux-user/syscall.c文件,在第191和265行分别查找以下内容:

static type name (void)
static int gettid

只需删除静态的,并将其改为以下内容:

type name (void)
int gettid

之后,再次运行构建脚本:

$ sudo ./build_qemu_support.sh

它将需要一些时间来编译,编译应该会成功。之后,进入AFL目录并安装:

$ AFL/qemu_mode# cd ..
$ sudo make install

这将安装afl-qemu-trace,这是使用qemu模式所需要的。 你已经安装完毕。现在让我们用gcc编译我们的C程序,输入以下命令:

gcc imgRead.c -o imgRead_qemu

之后,让我们在Qemu模式下进行模糊测试,我们需要为它提供选项-Q:

afl-fuzz -Q -i in/ -o out/ -- ./imgRead_qemu

你应该能看到af模糊测试的画面。

来源: http://fuzzing.in/codelabs/fuzzing_opensource/index.html?index=..%2F..index#17